package com.weaving.monitor.service;

import com.weaving.monitor.mapper.MatClothTypeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 下轮计划查询服务类
 * 
 * 功能说明：
 * 1. 提供通过机器ID查询下轮计划信息的功能
 * 2. 实现复杂的数据库关联查询逻辑
 * 3. 处理查询失败的情况，返回默认值
 * 
 * 注解说明：
 * - @Service: Spring注解，标识这是一个服务类
 * 
 * 方法说明：
 * - getNextPlanByMachineId: 根据机器ID查询下轮计划信息
 * 
 * @author 系统开发团队
 * @version 1.0
 * @since 2024-01-01
 */
@Service
public class NextPlanService {
    
    @Autowired
    private MatClothTypeMapper matClothTypeMapper;
    
    /**
     * 根据机器ID查询下轮计划信息
     * 
     * 功能说明：
     * 1. 通过机器ID查询对应的下轮计划信息
     * 2. 实现复杂的关联查询：机器ID->订单ID->物料类型ID->布种名称
     * 3. 处理查询失败的情况，返回默认值
     * 
     * 查询逻辑：
     * 1. 首先通过机器ID查询prod_prod_card表获取order_id
     * 2. 然后通过order_id查询prod_prod_order表获取mat_type_id
     * 3. 最后通过mat_type_id查询mat_cloth_type表获取name
     * 4. 按sort升序排列，取第一条记录
     * 5. 如果任何一步查询失败，返回默认值
     * 
     * 参数说明：
     * - machineId: 机器ID，如"J001"
     * 
     * 返回值说明：
     * - String: 布种类型名称，对应下轮计划
     * - 如果查询失败或参数为空，返回"--"
     * 
     * 异常处理：
     * - 捕获所有异常，避免影响主业务流程
     * - 记录错误日志，便于问题排查
     * 
     * @param machineId 机器ID，如"J001"
     * @return 布种类型名称，查询失败时返回"--"
     */
    public String getNextPlanByMachineId(String machineId) {
        try {
            // 参数校验
            if (machineId == null || machineId.trim().isEmpty()) {
                return "--";
            }
            
            // 构建机器ID格式（确保格式为J001、J002等）
            String formattedMachineId = formatMachineId(machineId);
            
            // 查询下轮计划信息
            String nextPlan = matClothTypeMapper.selectNextPlanByMachineId(formattedMachineId);
            
            // 返回查询结果或默认值
            return (nextPlan != null && !nextPlan.trim().isEmpty()) ? nextPlan.trim() : "--";
            
        } catch (Exception e) {
            // 记录错误日志，但不影响主业务流程
            System.err.println("查询下轮计划失败，机器ID: " + machineId + ", 错误: " + e.getMessage());
            return "--";
        }
    }
    
    /**
     * 根据机器ID查询当前生产物料类型
     * 
     * 功能说明：
     * 1. 通过机器ID查询当前正在生产的物料类型
     * 2. 实现复杂的关联查询：机器ID->订单ID->物料类型ID->布种名称
     * 3. 处理查询失败的情况，返回默认值
     * 
     * 查询逻辑：
     * 1. 首先通过机器ID查询prod_prod_card表获取order_id（状态为'1'）
     * 2. 然后通过order_id查询prod_prod_order表获取mat_type_id
     * 3. 最后通过mat_type_id查询mat_cloth_type表获取name
     * 4. 按sort升序排列，取第一条记录
     * 5. 如果任何一步查询失败，返回默认值
     * 
     * 参数说明：
     * - machineId: 机器ID，如"J001"
     * 
     * 返回值说明：
     * - String: 布种类型名称，对应当前生产物料
     * - 如果查询失败或参数为空，返回"--"
     * 
     * 异常处理：
     * - 捕获所有异常，避免影响主业务流程
     * - 记录错误日志，便于问题排查
     * 
     * @param machineId 机器ID，如"J001"
     * @return 布种类型名称，查询失败时返回"--"
     */
    public String getCurrentMatTypeByMachineId(String machineId) {
        try {
            // 参数校验
            if (machineId == null || machineId.trim().isEmpty()) {
                return "--";
            }
            
            // 构建机器ID格式（确保格式为J001、J002等）
            String formattedMachineId = formatMachineId(machineId);
            
            // 查询当前生产物料类型
            String currentMatType = matClothTypeMapper.selectCurrentMatTypeByMachineId(formattedMachineId);
            
            // 返回查询结果或默认值
            return (currentMatType != null && !currentMatType.trim().isEmpty()) ? currentMatType.trim() : "--";
            
        } catch (Exception e) {
            // 记录错误日志，但不影响主业务流程
            System.err.println("查询当前生产物料类型失败，机器ID: " + machineId + ", 错误: " + e.getMessage());
            return "--";
        }
    }
    
    /**
     * 格式化机器ID
     * 
     * 功能说明：
     * 1. 将机器编号转换为标准的机器ID格式
     * 2. 确保机器ID格式为J开头，三位数字格式
     * 
     * 转换规则：
     * - 如果输入是数字，转换为"J" + 三位数字格式
     * - 如果输入已经是J开头，直接返回
     * - 如果输入为空或无效，返回"J001"
     * 
     * @param machineId 原始机器ID
     * @return 格式化后的机器ID
     */
    private String formatMachineId(String machineId) {
        if (machineId == null || machineId.trim().isEmpty()) {
            return "J001";
        }
        
        String trimmed = machineId.trim();
        
        // 如果已经是J开头，直接返回
        if (trimmed.toUpperCase().startsWith("J")) {
            return trimmed.toUpperCase();
        }
        
        // 尝试解析为数字
        try {
            int machineNumber = Integer.parseInt(trimmed);
            return String.format("J%03d", machineNumber);
        } catch (NumberFormatException e) {
            // 如果无法解析为数字，返回默认值
            return "J001";
        }
    }
} 